home *** CD-ROM | disk | FTP | other *** search
- // TextArea.c V0.25
- // Zone de texte avec scrolling
- // (C) 1992 par Christophe PASSUELLO
- // Tue Mar 16 18:49:01 1993
-
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <mytypes.h>
- #include <graphics/text.h>
- #include <graphics/rastport.h>
- #define INTUITION_PREFERENCES_H 0
- #include "IObject_priv.h"
-
-
- IMPORT CPTR DiskfontBase;
- IMPORT UBYTE Pen1, Pen2;
-
- /* definition de la structure TextArea */
- struct TextArea
- {
- UWORD LeftEdge, TopEdge;
- UWORD Width, Height;
- struct RastPort *RPort;
- STRPTR LabelText;
- UBYTE FPen, BPen;
- UBYTE LineHeight;
- UBYTE WrMask;
- UWORD Flags;
- UWORD ClassFlags;
- struct Box TextBox;
- struct TextFont *Font;
- UWORD NbLine, NbCol;
- UWORD CurLine, CurCol;
- };
-
-
- /* Methodes pour la classe TextArea */
- VOID Locate(struct TextArea *, UWORD, UWORD);
- VOID ScrollTextArea(struct TextArea *, WORD);
- VOID FastScroll(struct TextArea *, WORD);
- UWORD ClipString(struct TextFont *, char *, UWORD, UWORD);
- UWORD StringLength(struct TextFont *, char *, UWORD);
- UWORD GetCurrentWidth(struct TextArea *);
- VOID LineFeed(struct TextArea *area);
-
-
- /* fonctions privees */
- PRIVATE VOID LowLevelText(struct TextArea *, char *, UWORD);
- PRIVATE VOID TextClip(struct TextArea *, char *, UWORD);
- PRIVATE UWORD SearchCtrl(char *, UWORD);
- PRIVATE UWORD DoCtrl(struct TextArea *, char *);
-
-
- /**********************************************/
- /* implementation des methodes pour TextArea */
- /**********************************************/
-
-
- //
- // Cree une zone texte
- //
- struct TextArea *CreateTextArea(struct NewTextArea *newarea, struct RastPort *rp)
- {
- struct TextArea *area;
-
- if (area = AllocMem( sizeof(struct TextArea), MEMF_CLEAR|MEMF_PUBLIC))
- {
- area->RPort = rp;
-
- COPY_BOX(&area->LeftEdge, &newarea->LeftEdge);
- COPY_BOX(&area->TextBox, &newarea->LeftEdge);
- AdjustBox(&area->TextBox, FALSE);
-
- area->Flags = newarea->Flags;
- area->ClassFlags = newarea->ClassFlags;
- area->LabelText = newarea->LabelText;
- area->Font = LoadFont(newarea->Font);
- area->FPen = newarea->FrontPen;
- area->BPen = newarea->BackPen;
- area->LineHeight = newarea->InterLine + area->Font->tf_YSize;
-
- area->NbCol = area->TextBox.w / area->Font->tf_XSize;
- area->NbLine = (area->TextBox.h + 1) / area->LineHeight;
-
- ClearTextArea(area);
-
- // affiche le label
- {
- struct TextEnv env;
-
- SaveTextEnv(rp, &env);
- SetAPen(rp, (area->Flags & LABEL_PEN2) ? Pen2 : Pen1);
- SetFont(rp, area->Font);
- PrintLabelText(rp, &area->LeftEdge, area->LabelText, area->Flags & LABEL_MASK); //MASK
- RestoreTextEnv(rp, &env);
- }
- }
- return (area);
- }
-
-
- //
- // Libere le TextArea
- //
- VOID FreeTextArea(struct TextArea *area)
- {
- CloseFont(area->Font);
- FreeMem(area, sizeof(struct TextArea) );
- }
-
-
- //
- // Efface la TextArea
- //
- VOID ClearTextArea(struct TextArea *area)
- {
- FillBox(&area->LeftEdge, area->RPort, area->BPen);
- Draw3DBox(&area->LeftEdge, area->RPort, BOX_1IN);
- area->CurCol = area->CurLine = 0;
- }
-
-
- //
- // Change les couleurs du TextArea
- //
- VOID SetTextAreaPen(struct TextArea *area, UBYTE fg, UBYTE bg)
- {
- area->FPen = fg;
- area->BPen = bg;
- }
-
-
- /************************************/
- /* Scroll le TextArea de off lignes */
- /************************************/
- VOID FastScroll(struct TextArea *area, WORD off)
- {
- WORD dy;
- UWORD x, y;
-
- dy = off * area->LineHeight;
- y = area->TextBox.y; x = area->TextBox.x;
- ScrollRaster(area->RPort, 0, dy, x, y, x+area->TextBox.w-1, y+area->TextBox.h-1);
- }
-
-
- /************************************/
- /* Scroll le TextArea de off lignes */
- /************************************/
- VOID ScrollTextArea(struct TextArea *area, WORD off)
- {
- WORD dy, YSize, nb;
- UWORD x, y;
- UBYTE bpen;
-
- YSize = area->LineHeight;
- nb = ABS( off );
- dy = SIGN(off);
-
- if (area->ClassFlags & TAF_SMOOTH_SCROLL)
- nb *= YSize;
- else
- dy *= YSize;
-
- bpen = area->RPort->BgPen;
- SetBPen(area->RPort, area->BPen);
- y = area->TextBox.y; x = area->TextBox.x;
- while (nb-- > 0)
- ScrollRaster(area->RPort, 0, dy, x, y, x+area->TextBox.w-1, y+area->TextBox.h-1);
-
- SetBPen(area->RPort, bpen);
- }
-
-
- /********************************************/
- /* Calcule la taille en pixels d'une chaine */
- /********************************************/
- UWORD StringLength(struct TextFont *CurrentFont, char *s, UWORD len)
- {
- UWORD width, *space;
- UBYTE car, lochar;
-
- width = 0;
- if (CurrentFont->tf_Flags & FPF_PROPORTIONAL)
- { /* la fonte est proportionnelle */
- space = CurrentFont->tf_CharSpace;
- lochar = CurrentFont->tf_LoChar;
-
- while (len-- > 0)
- {
- car = *(s++);
- if (car < lochar)
- car = lochar;
-
- width += space[car-lochar];
- }
- }
- else
- width = len * CurrentFont->tf_XSize;
-
- return (width);
- }
-
-
- /******************************************/
- /* Fonction pour clipper une chaine */
- /* Renvoie le taille de la chiane clippee */
- /******************************************/
- UWORD ClipString(struct TextFont *CurrentFont, char *s, UWORD len, WORD widthmax)
- {
- UWORD *space, length;
- UBYTE car, lochar;
-
- if (CurrentFont->tf_Flags & FPF_PROPORTIONAL)
- {
- // la fonte est proportionnelle
- space = CurrentFont->tf_CharSpace;
- lochar = CurrentFont->tf_LoChar;
- length = 0;
-
- while (len-- > 0)
- {
- car = *(s++);
- if (car < lochar)
- car = lochar;
-
- widthmax -= space[car-lochar];
- if (widthmax < 0)
- break;
-
- length++;
- }
- return (length);
- }
- else
- return ( MIN(len, widthmax / CurrentFont->tf_XSize) );
- }
-
-
- /*************************************/
- /* Fonction pour afficher une chaine */
- /*************************************/
- VOID TAPrint(struct TextArea *area,char *s)
- {
- char *ptr, car;
- UWORD len, clen;
-
- len = strlen(s);
-
- while (len > 0)
- {
- clen = SearchCtrl(s, len);
- if (clen)
- {
- TextClip(area, s, clen);
- s += clen;
- len -= clen;
- if (len == 0)
- break;
- }
- clen = DoCtrl(area, s);
- /* saute le code de controle */
- len -= clen;
- s += clen;
- }
- }
-
-
- /*********************************************************/
- /* Fonction pour afficher une chaine avec retour chariot */
- /*********************************************************/
- VOID TAPuts(struct TextArea *area,char *s)
- {
- TAPrint(area, s);
- LineFeed(area);
- }
-
-
- /****************************************************/
- /* Renvoie le nombre de pixels de la ligne courante */
- /****************************************************/
- UWORD GetCurrentWidth(struct TextArea *area)
- {
- if (area->Font->tf_Flags & FPF_PROPORTIONAL)
- return (area->TextBox.w - area->CurCol);
- else
- return (area->TextBox.w - area->CurCol * area->Font->tf_XSize);
- }
-
-
- /********************************************/
- /* Cherche le premier caractere de controle */
- /********************************************/
- PRIVATE UWORD SearchCtrl(char *s, UWORD len)
- {
- UWORD clen;
-
- #define LF 0x0a
-
- clen = 0;
- while (len > 0)
- {
- if ( *(s++) == LF )
- break;
- clen++;
- len--;
- }
- return( clen );
- }
-
-
- /********************************************/
- /* Cherche le premier caractere de controle */
- /********************************************/
- PRIVATE UWORD DoCtrl(struct TextArea *area, char *s)
- {
- LineFeed(area);
- return ( 1 );
- }
-
-
- /********************/
- /* Passe a la ligne */
- /********************/
- VOID LineFeed(struct TextArea *area)
- {
- if (area->CurLine >= area->NbLine)
- {
- ScrollTextArea(area, 1);
- area->CurLine = area->NbLine - 1;
- }
- else
- area->CurLine++;
-
- area->CurCol = 0;
- }
-
-
- /****************************/
- /* ecrit une chaine clippée */
- /****************************/
- PRIVATE VOID TextClip(struct TextArea *area, char *s, UWORD len)
- {
- UWORD w, clen;
-
- while (len > 0)
- {
- if (area->CurLine >= area->NbLine)
- LineFeed(area);
-
- w = GetCurrentWidth(area);
- clen = ClipString(area->Font, s, len, w);
- LowLevelText(area, s, clen);
-
- /* mise a jour du curseur */
- if (area->Font->tf_Flags & FPF_PROPORTIONAL)
- area->CurCol += StringLength(area->Font, s, clen);
- else
- area->CurCol += clen;
-
- /* mise a jour de la chaine */
- len -= clen;
- s += clen;
- if ( (len > 0) AND (area->ClassFlags & TAF_CLIP_TEXT) )
- LineFeed(area);
- else
- break;
- }
- }
-
-
- /****************************/
- /* ecrit une chaine clippée */
- /****************************/
- PRIVATE VOID LowLevelText(struct TextArea *area, char *s, UWORD len)
- {
- struct RastPort *rp;
- struct TextEnv env;
-
- rp = area->RPort;
- SaveTextEnv(rp, &env);
-
- SetDrMd(rp, JAM2);
- SetFont(rp, area->Font);
- {
- WORD x, y;
-
- y = area->TextBox.y + (area->CurLine * area->LineHeight);
-
- if (area->Font->tf_Flags & FPF_PROPORTIONAL)
- x = area->TextBox.x + area->CurCol;
- else
- x = area->TextBox.x + area->CurCol * area->Font->tf_XSize;
-
- /* reecrire l'entree */
- SetAPen(rp, area->FPen);
- SetBPen(rp, area->BPen);
- Move(rp, x, y + area->Font->tf_Baseline);
- Text(rp, s, len);
- }
- RestoreTextEnv(rp, &env);
- }
-